LangChain 入门(一) 搭建本地知识库 您所在的位置:网站首页 python 生产环境搭建 LangChain 入门(一) 搭建本地知识库

LangChain 入门(一) 搭建本地知识库

2023-06-13 16:04| 来源: 网络整理| 查看: 265

认真写好每一篇文章

安装

pip install openai -i pypi.douban.com/simple --trusted-host pypi.douban.com

pip install langchain -i pypi.douban.com/simple --trusted-host pypi.douban.com

pip install urllib3==1.25.11 -i pypi.douban.com/simple --trusted-host pypi.douban.com

import os from langchain.llms import OpenAI os.environ["OPENAI_API_KEY"] = 'xxx' llm = OpenAI(model_name="text-davinci-003", max_tokens=1024) result = llm("怎么评价人工智能") print(result)

返回结果

人工智能是一种具有智能的技术,它可以让机器像人一样做出智能的决定和行动,从而提高生产力和服务质量。目前,人工智能已经发展到深度学习领域,可以让机器自主学习,有效地解决复杂的问题,为社会发展做出贡献。总之,人工智能是一种极具前景的技术,具有重要的社会意义。 问题

rbody, rcode, resp.data, rheaders, stream_error=stream_error openai.error.AuthenticationError:

看看你openKey 好使不,如果不好使,我这有库存,也可以百度 找个好使的chatgpt 号

通过 Google 搜索并返回答案

这里我们需要借助 Serpapi 来进行实现,Serpapi 提供了 google 搜索的 api 接口。

首先需要我们到 Serpapi 官网上注册一个用户,serpapi.com/ 并复制他给我们生成 api key。

推荐使用 Github登录 image.png

先执行 pip install google-search-results -i pypi.douban.com/simple --trusted-host pypi.douban.com

import os os.environ\["OPENAI\_API\_KEY"] = '你的api key' os.environ["SERPAPI_API_KEY"] = '你的api key' from langchain.agents import load\_tools from langchain.agents import initialize\_agent from langchain.llms import OpenAI from langchain.agents import AgentType # 加载 OpenAI 模型 llm = OpenAI(temperature=0,max\_tokens=2048) # 加载 serpapi 工具 tools = load\_tools(\["serpapi"]) # 如果搜索完想再计算一下可以这么写 # tools = load\_tools(\['serpapi', 'llm-math'], llm=llm) # 如果搜索完想再让他再用python的print做点简单的计算,可以这样写 # tools=load\_tools(\["serpapi","python\_repl"]) # 工具加载后都需要初始化,verbose 参数为 True,会打印全部的执行详情 agent = initialize\_agent(tools, llm, agent=AgentType.ZERO\_SHOT\_REACT\_DESCRIPTION, verbose=True) # 运行 agent agent.run("What's the date today? What great events have taken place today in history?")

image.png

我们可以看到,他正确的返回了日期(有时差),并且返回了历史上的今天。

在 chain 和 agent 对象上都会有 verbose 这个参数,这个是个非常有用的参数,开启他后我们可以看到完整的 chain 执行过程。

可以在上面返回的结果看到,他将我们的问题拆分成了几个步骤,然后一步一步得到最终的答案。

关于agent type 几个选项的含义(理解不了也不会影响下面的学习,用多了自然理解了):

zero-shot-react-description: 根据工具的描述和请求内容的来决定使用哪个工具(最常用) react-docstore: 使用 ReAct 框架和 docstore 交互, 使用Search 和Lookup 工具, 前者用来搜, 后者寻找term, 举例: Wipipedia 工具 self-ask-with-search 此代理只使用一个工具: Intermediate Answer, 它会为问题寻找事实答案(指的非 gpt 生成的答案, 而是在网络中,文本中已存在的), 如 Google search API 工具 conversational-react-description: 为会话设置而设计的代理, 它的prompt会被设计的具有会话性, 且还是会使用 ReAct 框架来决定使用来个工具, 并且将过往的会话交互存入内存

reAct 介绍可以看这个:arxiv.org/pdf/2210.03…

LLM 的 ReAct 模式的 Python 实现: til.simonwillison.net/llms/python…

agent type 官方解释:

python.langchain.com/en/latest/m…

有一点要说明的是,这个 serpapi 貌似对中文不是很友好,所以提问的 prompt 建议使用英文。

当然,官方已经写好了 ChatGPT Plugins 的 agent,未来 chatgpt 能用啥插件,我们在 api 里面也能用插件,想想都美滋滋。

不过目前只能使用不用授权的插件,期待未来官方解决这个。

感兴趣的可以看这个文档:python.langchain.com/en/latest/m…

对超长文本进行总结

假如我们想要用 openai api 对一个段文本进行总结,我们通常的做法就是直接发给 api 让他总结。但是如果文本超过了 api 最大的 token 限制就会报错。

这时,我们一般会进行对文章进行分段,比如通过 tiktoken 计算并分割,然后将各段发送给 api 进行总结,最后将各段的总结再进行一个全部的总结。

如果,你用是 LangChain,他很好的帮我们处理了这个过程,使得我们编写代码变的非常简单。

先执行 pip install unstructured -i pypi.douban.com/simple --trusted-host pypi.douban.com

pip install pdf2image -i pypi.douban.com/simple --trusted-host pypi.douban.com

代码

from langchain.document_loaders import UnstructuredFileLoader from langchain.chains.summarize import load_summarize_chain from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain import OpenAI # 导入文本 loader = UnstructuredFileLoader("/content/sample_data/data/lg_test.txt") # 将文本转成 Document 对象 document = loader.load() print(f'documents:{len(document)}') # 初始化文本分割器 text_splitter = RecursiveCharacterTextSplitter( chunk_size = 500, chunk_overlap = 0 ) # 切分文本 split_documents = text_splitter.split_documents(document) print(f'documents:{len(split_documents)}') # 加载 llm 模型 llm = OpenAI(model_name="text-davinci-003", max_tokens=1500) # 创建总结链 chain = load_summarize_chain(llm, chain_type="refine", verbose=True) # 执行总结链,(为了快速演示,只总结前5段) chain.run(split_documents[:5])

最终输出了对前 5 个 document 的总结。

这里有几个参数需要注意:

文本分割器的 chunk_overlap 参数

这个是指切割后的每个 document 里包含几个上一个 document 结尾的内容,主要作用是为了增加每个 document 的上下文关联。比如,chunk_overlap=0时, 第一个 document 为 aaaaaa,第二个为 bbbbbb;当 chunk_overlap=2 时,第一个 document 为 aaaaaa,第二个为 aabbbbbb。

不过,这个也不是绝对的,要看所使用的那个文本分割模型内部的具体算法。

文本分割器可以参考这个文档:python.langchain.com/en/latest/m…

chain 的 chain_type 参数

这个参数主要控制了将 document 传递给 llm 模型的方式,一共有 4 种方式:

stuff: 这种最简单粗暴,会把所有的 document 一次全部传给 llm 模型进行总结。如果document很多的话,势必会报超出最大 token 限制的错,所以总结文本的时候一般不会选中这个。

map_reduce: 这个方式会先将每个 document 进行总结,最后将所有 document 总结出的结果再进行一次总结。

refine: 这种方式会先总结第一个 document,然后在将第一个 document 总结出的内容和第二个 document 一起发给 llm 模型在进行总结,以此类推。这种方式的好处就是在总结后一个 document 的时候,会带着前一个的 document 进行总结,给需要总结的 document 添加了上下文,增加了总结内容的连贯性。

map_rerank: 这种一般不会用在总结的 chain 上,而是会用在问答的 chain 上,他其实是一种搜索答案的匹配方式。首先你要给出一个问题,他会根据问题给每个 document 计算一个这个 document 能回答这个问题的概率分数,然后找到分数最高的那个 document ,在通过把这个 document 转化为问题的 prompt 的一部分(问题+document)发送给 llm 模型,最后 llm 模型返回具体答案。

资料来源

感谢 liaokong.gitbook.io/llm-kai-fa-…

代码

github.com/a25017012/L…

只是其demo的代码



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有